#include "ennemi.h"
#include "assert.h"
#include <malloc.h>
#include <time.h>


bombe* bombeInit(terrain* ter, const int x, const int y, const int puissance, const int numJoueur)
{
    bombe* bombe = malloc(3*sizeof(int)+sizeof(clock_t)+sizeof(int));
    int i = 0;
    while(ter->bombeTab[i] != 0)
        i++;
    assert(i<7);
    bombe->x = x;
    bombe->y = y;
    bombe->puissance = puissance;
    bombe->heureInit = clock();
    bombe->joueur = numJoueur;
    ter->bombeTab[i] = bombe;
    return bombe;
}

const int bombeGetX(const bombe* bombe)
{
    return bombe->x;
}

const int bombeGetY(const bombe* bombe)
{
    return bombe->y;
}

const int bombeGetPuissance(const bombe* bombe)
{
    return bombe->puissance;
}

const time_t bombeGetHeureInit(const bombe* bombe)
{
    return bombe->heureInit;
}

void bombeAffiche(const bombe* bombe, terrain* ter)
{
    terrainSetXY(ter, bombeGetX(bombe), bombeGetY(bombe), 'o');
}

int bombeExplose(terrain* ter, bombe* bombe, const int cooX, const int cooY)
{
    int i;
    int vieMario = 0;
    int bombeX = bombeGetX(bombe);
    int bombeY = bombeGetY(bombe);
    int puissance = bombeGetPuissance(bombe);

    for (i=bombeX-1-puissance; i<= bombeX+1+puissance; i++)
    {
        if(bombeY >= 0 && bombeY <= 15 && i >= 0 && i <= 15 )
        {
                switch (ter->terrainTab[bombeY][i])
                {
                    /* retire les caisses */
                    case 'C' : terrainSetXY(ter, i, bombeY, '.'); break;
                    /* retire les bombes */

                    /* tue les ennemis */
                    case '0' : ennemiDetruire(ter->ennemiTab[0], ter);
                                terrainSetXY(ter, i, bombeY, '.');
                                break;
                    case '1' : ennemiDetruire(ter->ennemiTab[1], ter);
                                terrainSetXY(ter, i, bombeY, '.');
                                break;
                    case '2' : ennemiDetruire(ter->ennemiTab[2], ter);
                                terrainSetXY(ter, i, bombeY, '.');
                                break;
                    case '3' : ennemiDetruire(ter->ennemiTab[3], ter);
                                terrainSetXY(ter, i, bombeY, '.');
                                break;
                    default:break;
                }

            /* retire une vie à Mario */
            if (i == cooX && bombeY == cooY)
                vieMario = 1;
        }
    }

    for (i=bombeY-1-puissance; i<= bombeY+1+puissance; i++)
    {
        if(i >= 0 && i < 15 && bombeX >= 0 && bombeX < 16 )
        {
                switch (ter->terrainTab[i][bombeX])
                {
                    /* retire les caisses */
                    case 'C' : terrainSetXY(ter, bombeX, i, '.'); break;
                    /* retire les bombes
                    case 'o' : terrainSetXY(ter, bombeX, i, '.'); break;*/
                    /* tue les ennemis */
                    case '0' : ennemiDetruire(ter->ennemiTab[0], ter);
                                terrainSetXY(ter, bombeX, i, '.');
                                break;
                    case '1' : ennemiDetruire(ter->ennemiTab[1], ter);
                                terrainSetXY(ter, bombeX, i, '.');
                                break;
                    case '2' : ennemiDetruire(ter->ennemiTab[2], ter);
                                terrainSetXY(ter, bombeX, i, '.');
                                break;
                    case '3' : ennemiDetruire(ter->ennemiTab[3], ter);
                                terrainSetXY(ter, bombeX, i, '.');
                                break;
                    default:break;
                }
            /* retire une vie à Mario */
            if (bombeX == cooX && i == cooY)
                vieMario = 1;
        }
    }
    terrainSetXY(ter, bombeX, bombeY, '.');
    return vieMario;
}

void bombeLibere(terrain* ter, const int i)
{
    free(ter->bombeTab[i]);
    ter->bombeTab[i] = 0;
}
